﻿namespace zijian666.WorkScheduler.Abstractions;

/// <summary>
/// 表示一个令牌。
/// </summary>
public interface IToken : IDisposable
{
    /// <summary>
    /// 激活令牌，该操作会更新令牌的最后活动时间。
    /// </summary>
    /// <exception cref="InvalidOperationException">
    /// 如果令牌已经被释放，则会抛出该异常。
    /// </exception>
    void Activation();
    /// <summary>
    /// 令牌过期策略。
    /// </summary>
    IExpirationPolicy Expiration { get; }
    /// <summary>
    /// 传播有关应取消操作的通知 
    /// </summary>
    CancellationToken Cancellation { get; }
    /// <summary>
    /// 创建时间
    /// </summary>
    DateTimeOffset CreatedTime { get; }
    /// <summary>
    /// 令牌的最后活动时间。
    /// </summary>
    DateTimeOffset LastActiveTime { get; }
    /// <summary>
    /// 是否已释放
    /// </summary>
    bool IsDisposed { get; }
}

public static class ITokenExtensions
{
    /// <summary>
    /// 获取一个值，该值指示当前令牌是否已经过期。
    /// </summary>
    /// <param name="token">要检查的令牌。</param>
    /// <returns>如果令牌已经过期，则为 <see langword="true"/>；否则为 <see langword="false"/>。</returns>
    public static bool IsExpired(this IToken? token)
        => token is null ? true : token.Expiration.IsExpired(token);
}